import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class MergeLists {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 读取第一个列表A
        List<Integer> listA = new ArrayList<>();
        String lineA = scanner.nextLine();
        String[] elementsA = lineA.trim().split("\\s+");
        for (String element : elementsA) {
            listA.add(Integer.parseInt(element));
        }

        // 读取第二个列表B
        List<Integer> listB = new ArrayList<>();
        String lineB = scanner.nextLine();
        String[] elementsB = lineB.trim().split("\\s+");
        for (String element : elementsB) {
            listB.add(Integer.parseInt(element));
        }

        // 合并列表，保持有序
        mergeLists(listA, listB);

        // 输出结果
        for (int i = 0; i < listA.size(); i++) {
            if (i > 0) {
                System.out.print(" ");
            }
            System.out.print(listA.get(i));
        }
    }

    private static void mergeLists(List<Integer> listA, List<Integer> listB) {
        int i = 0, j = 0;
        while (j < listB.size()) {
            if (i < listA.size() && listA.get(i) <= listB.get(j)) {
                i++;
            } else {
                // 插入listB[j]到listA的正确位置
                int insertIndex = (i > 0) ? findInsertIndex(listA, listB.get(j), 0, i - 1) : 0;
                listA.add(insertIndex, listB.get(j));
                i = insertIndex + 1; // 更新i以跳过新插入的元素
            }
            j++;
        }
    }

    // 辅助方法：在有序列表中查找插入位置（二分查找优化版）
    private static int findInsertIndex(List<Integer> list, int element, int left, int right) {
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (list.get(mid) > element) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return left; // left会指向第一个大于element的位置，因此插入位置是left
    }
}
